
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>面向对象 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>面向对象 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Java作为面向对象语言，其四大核心特性是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Java的四大核心特性是：封装、继承、多态和抽象。这些特性通过类、对象、接口等机制提供了强大的代码复用、扩展和维护能力。</div>
          </div>
          <div class="card-source">来源: Java 面向对象的特性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">概念</div>
          <div class="card-question">在面向对象编程中，类（Class）和对象（Object）的关系是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">概念</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">类是对象的模板或蓝图，定义了一组具有相同属性和行为的对象。对象是类的实例，是一个具体的、有实际值的实体。</div>
          </div>
          <div class="card-source">来源: 面向对象的基本概念 -> 1. 类与对象</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Java中的多态性（Polymorphism）分为哪两种主要类型？请分别解释。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">多态分为两种：1. 编译时多态（方法重载 Overloading）：指在同一个类中，方法名称相同但参数列表不同。 2. 运行时多态（方法重写 Overriding）：指子类重写父类的方法，程序在运行时动态调用子类重写后的方法。</div>
          </div>
          <div class="card-source">来源: 面向对象的基本概念 -> 5. 多态（Polymorphism）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">什么是封装（Encapsulation）？在Java中通常如何实现？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">封装是指将对象的属性和行为（方法）封装在一个类中，并通过访问控制符对外界隐藏对象的内部实现细节，仅暴露必要的接口供外界使用。在Java中，通常通过使用`private`等访问修饰符限制属性的直接访问，并提供`public`的getter和setter方法来实现对私有属性的访问和修改。</div>
          </div>
          <div class="card-source">来源: Java 面向对象的特性 -> 1. 封装（Encapsulation）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">对比</div>
          <div class="card-question">继承（Inheritance）和组合（Composition）在表示类间关系上有什么根本区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">对比</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">继承表示的是 "is-a" 关系，即子类是父类的一种特殊类型（例如，`Dog` is a `Animal`）。而组合表示的是 "has-a" 关系，即一个类包含另一个类的实例作为其成员（例如，`Car` has a `Engine`）。</div>
          </div>
          <div class="card-source">来源: 继承与组合</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">请简述Java中的四种访问修饰符及其访问权限。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. `public`：对所有类、包和子类开放，任何地方都可以访问。 2. `protected`：对同一包中的类以及不同包中的子类开放。 3. `private`：仅对定义它的当前类可见。 4. 默认（package-private）：在没有明确指定修饰符时使用，仅对同一包内的类可见。</div>
          </div>
          <div class="card-source">来源: 访问控制与权限修饰符 -> 1. 访问修饰符（Access Modifiers）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">概念</div>
          <div class="card-question">构造器（Constructor）有哪些主要特点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">概念</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">构造器的主要特点包括：1. 构造器名称必须与类名相同。2. 没有返回值类型，不能声明为`void`。3. 在创建对象时被自动调用。4. 支持重载，即可以有多个参数列表不同的构造器。</div>
          </div>
          <div class="card-source">来源: 方法与构造器 -> 构造器（Constructor） -> 2. 构造器的特点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">对比</div>
          <div class="card-question">静态代码块和构造器的调用时机有何核心区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">对比</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">核心区别在于调用时机：静态代码块在类加载时调用，并且在程序的整个生命周期中仅调用一次，用于类级别的初始化。而构造器则是在每次创建对象实例时被调用，用于对象级别的初始化。</div>
          </div>
          <div class="card-source">来源: 方法与构造器 -> 7. 静态代码块与构造器的区别</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在软件设计中，何时应该优先选择组合而非继承？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当类之间存在 "has-a" 关系（一个类包含另一个类），或者当系统需要高灵活性，可能需要在运行时替换某个组件时，应优先选择组合。组合可以避免过深的继承层次，实现更低的耦合。</div>
          </div>
          <div class="card-source">来源: 继承与组合 -> 3.2 何时使用组合</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Java 8 对接口（Interface）的功能进行了哪些重要增强？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Java 8 对接口的增强主要体现在两个方面：1. 增加了默认方法（Default Method），允许在接口中定义带有默认实现的方法。2. 增加了静态方法（Static Method），允许在接口中定义静态方法，可以直接通过接口名调用。</div>
          </div>
          <div class="card-source">来源: 类的高级特性 -> 3. 抽象类与接口的高级用法 -> 接口的增强（Java 8+）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Java中的内部类（Inner Class）主要分为哪四种类型？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Java中的内部类主要分为四种：1. 成员内部类（定义在类的成员位置）。2. 静态内部类（使用`static`修饰）。3. 局部内部类（定义在方法或代码块中）。4. 匿名内部类（没有名字的内部类）。</div>
          </div>
          <div class="card-source">来源: 类的高级特性 -> 1. 内部类（Inner Class）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">对比</div>
          <div class="card-question">抽象类（Abstract Class）和接口（Interface）在定义和用途上有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">对比</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">定义上，抽象类可以包含抽象方法和具体实现的方法，而接口通常只包含方法的声明（Java 8后支持默认和静态方法）。用途上，抽象类用于定义一种通用的基类结构，体现"is-a"关系；接口则用于定义完全抽象的结构，实现类似多继承的功能，体现"can-do"的能力。</div>
          </div>
          <div class="card-source">来源: 面向对象的基本概念 -> 6. 抽象性（Abstraction）</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
